package com.剑指offer;

import java.util.ArrayList;
import java.util.Stack;
/*
* 请实现一个函数按照之字形打印二叉树，即第一行按照从左到右的顺序打印，
* 第二层按照从右至左的顺序打印，第三行按照从左到右的顺序打印，其他行以此类推。
* */
public class _59按之字型顺序打印二叉树
{
    public static ArrayList<ArrayList<Integer>> Print(TreeNode_Number pRoot)
    {
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();
//        记录奇数层的结点
        Stack<TreeNode_Number> s1 = new Stack<>();
//        记录偶数层的结点
        Stack<TreeNode_Number> s2 = new Stack<>();
        s1.push(pRoot);
//        记录层数
        int layer = 1;

        while (!s1.isEmpty() || !s2.isEmpty())
        {
            if (layer % 2 != 0)
            {
                ArrayList<Integer> temp = new ArrayList<>();
                while (!s1.isEmpty())
                {
                    TreeNode_Number node = s1.pop();
                    if (node != null)
                    {
                        temp.add(node.val);
                        System.out.println(node.val + " ");
                        s2.push(node.left);
                        s2.push(node.right);
                    }
                }
                if (!temp.isEmpty())
                {
                    list.add(temp);
                    layer++;
                }
            }
            else
            {
                ArrayList<Integer> temp = new ArrayList<>();
                while (!s2.isEmpty())
                {
                    TreeNode_Number node = s2.pop();
                    if (node != null)
                    {
                        temp.add(node.val);
                        System.out.println(node.val + " ");
                        s1.push(node.right);
                        s1.push(node.left);
                    }
                }
                if (!temp.isEmpty())
                {
                    list.add(temp);
                    layer++;
                }
            }
        }
        return list;
    }
}
